package org.test.jmx.dynamic;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.AttributeNotFoundException;
import javax.management.DynamicMBean;
import javax.management.InvalidAttributeValueException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.ReflectionException;

import org.test.jmx.standard.ServerImpl;
/**
 * 动态MBean
 * 必须实现javax.management.DynamicMBean接口，所有的属性，方法都在运行时定义（通过getMBeanInfo）
 * @author Administrator
 *
 */

public class ServerMonitor implements DynamicMBean {

	/**
	 * 监控的对象
	 */
	private final ServerImpl target;
	
	private MBeanInfo mBeanInfo;

	public ServerMonitor(ServerImpl target) {
		this.target = target;
	}

	// 实现获取被管理的 ServerImpl 的 upTime
	public long upTime() {
		return System.currentTimeMillis() - target.startTime;
	}

	// javax.management.MBeanServer 会通过查询 getAttribute("Uptime") 获得 "Uptime" 属性值
	@Override
	public Object getAttribute(String attribute)
			throws AttributeNotFoundException, MBeanException,
			ReflectionException {
		if (attribute.equals("UpTime")) {
			return upTime();
		}
		return null;
	}

	// 给出 ServerMonitor 的元信息。
	@Override
	public MBeanInfo getMBeanInfo() {
		if (mBeanInfo == null) {
			try {
				Class cls = this.getClass();
				// 用反射获得 "upTime" 属性的读方法
				Method readMethod = cls.getMethod("upTime", new Class[0]);
				// 用反射获得构造方法
				Constructor constructor = cls
						.getConstructor(new Class[] { ServerImpl.class });
				// 关于 "upTime" 属性的元信息 : 名称为 UpTime，只读属性 ( 没有写方法 )。
				MBeanAttributeInfo upTimeMBeanAttributeInfo = new MBeanAttributeInfo(
						"UpTime", "The time span since server start",
						readMethod, null);
				// 关于构造函数的元信息
				MBeanConstructorInfo mBeanConstructorInfo = new MBeanConstructorInfo(
						"Constructor for